Tutvuge JavaScript Temporal.Duration API-ga tĂ€pseks ajaintervallide arvutamiseks, vĂ”rdlemiseks ja vormindamiseks. Ăppige haldama ajaperioode globaalselt, vĂ€ltides Date-objekti probleeme.
JavaScript Temporal.Duration: Ajaintervallide Aritmeetika ja Vormindamise Valdamine Globaalsetes Rakendustes
Aja haldamine tarkvaraarenduses on kurikuulsalt keeruline. Alates projektide ajakavade jĂ€lgimisest kontinentideĂŒleselt kuni rahvusvaheliste videokonverentside planeerimiseni vĂ”ivad ajaintervallide, ajavööndite ja suveaja nĂŒansid kiiresti pĂ”hjustada peeneid, kuid kriitilisi vigu. AastakĂŒmneid on JavaScripti arendajad maadelnud sisseehitatud Date-objektiga, mis on tööriist, mis, kuigi funktsionaalne lihtsate ajahetkede jaoks, jÀÀb hĂ€tta tĂ€pse ajaintervallide aritmeetika ja robustse, globaalselt teadliku ajahaldusega.
Siin tuleb mĂ€ngu JavaScript Temporal API â murranguline ettepanek, mis on loodud pakkuma kaasaegset, robustset ja kasutajasĂ”bralikku API-d kuupĂ€evade ja kellaaegadega töötamiseks JavaScriptis. Selle vĂ”imsate uute tĂŒĂŒpide hulgas paistab Temporal.Duration silma kui lĂ”plik lahendus ajaintervallide kĂ€sitlemiseks. See artikkel sĂŒveneb Temporal.Duration'isse, uurides selle vĂ”imekust aritmeetikas, vĂ”rdlemises ja intelligentses vormindamises, tagades, et teie rakendused suudavad aega hallata globaalse tĂ€psuse ja selgusega.
ĂkskĂ”ik, kas ehitate globaalset logistikasĂŒsteemi, finantskauplemisplatvormi vĂ”i mitme ajavööndi sĂŒndmuste planeerijat, on Temporal.Duration'i mĂ”istmine ĂŒlioluline ajaga seotud mitmetĂ€henduslikkuse kĂ”rvaldamiseks ja usaldusvÀÀrsete, rahvusvahelistatud kasutajakogemuste pakkumiseks.
JavaScripti Date-objekti puudused ajaintervallide kÀsitlemisel
Enne kui tÀhistame Temporal.Duration'i saabumist, on oluline mÔista olemasoleva Date-objekti piiranguid, eriti ajaintervallidega tegelemisel. Date-objekt esindab kindlat ajahetke, mÔÔdetuna millisekundites alates Unixi epohhist (1. jaanuar 1970, UTC). Kuigi seda saab kasutada lihtsa aritmeetika tegemiseks, on sellel mitmeid olemuslikke vigu, mis muudavad selle robustseks kestuse haldamiseks sobimatuks:
-
Muutlikkus:
Date-objektid on muutlikud. Iga operatsioonDate-objektiga muudab selle sisemist olekut, mis vĂ”ib pĂ”hjustada ootamatuid kĂ”rvalmĂ”jusid ja raskesti jĂ€lgitavaid vigu, eriti keerukates rakendustes vĂ”i samaaegsetes keskkondades.const d = new Date('2023-01-15T10:00:00Z'); const d2 = d; // d2 viitab nĂŒĂŒd samale objektile kui d d.setHours(d.getHours() + 1); console.log(d.toISOString()); // 2023-01-15T11:00:00.000Z console.log(d2.toISOString()); // 2023-01-15T11:00:00.000Z (ka d2 muutus!) -
Kestuse kontseptsiooni puudumine:
Date-objektil puudub otsene "kestuse" vÔi "perioodi" mÔiste. Kahe kuupÀeva vahe arvutamine annab tulemuseks millisekundite arvu, mis tuleb seejÀrel kÀsitsi teisendada aastateks, kuudeks, pÀevadeks jne. See kÀsitsi teisendamine on vigadele altis, eriti kui tegemist on erineva pikkusega kuude vÔi liigaastatega.const date1 = new Date('2023-01-01T00:00:00Z'); const date2 = new Date('2023-03-01T00:00:00Z'); const diffMs = date2.getTime() - date1.getTime(); // Mitu kuud see on? Aga liigaastad? // (diffMs / (1000 * 60 * 60 * 24 * 30)) on parimal juhul ligikaudne. console.log(`Difference in milliseconds: ${diffMs}`); console.log(`Approximate days: ${diffMs / (1000 * 60 * 60 * 24)}`); // Töötab pÀevade puhul, kuid pole kuude/aastate jaoks robustne -
Ajavööndi mitmetÀhenduslikkus:
Date-objektid ajavad sageli segi kohaliku aja ja UTC. Kuigi need salvestavad sisemiselt UTC millisekundeid, töötavad nende meetodid vaikimisi sageli sĂŒsteemi kohalikus ajavööndis, mis pĂ”hjustab segadust ja ebajĂ€rjekindlust hajutatud sĂŒsteemide vĂ”i rahvusvaheliste kasutajatega töötamisel. - Suveaja (DST) vĂ€ljakutsed: Suveajale ĂŒleminekud vĂ”ivad pĂ”hjustada pĂ€evade pikkuseks 23 vĂ”i 25 tundi. Lihtne aritmeetika (nt 24 tunni lisamine kuupĂ€evale) ei pruugi alati anda tulemuseks jĂ€rgmist kalendripĂ€eva, mis viib valede arvutusteni, kui "pĂ€eva" eeldatakse olevat fikseeritud 24-tunnine periood.
Need piirangud on ajalooliselt sundinud arendajaid toetuma kolmandate osapoolte teekidele nagu Moment.js vÔi date-fns vÔi kirjutama keerulist, vigadele altist kohandatud koodi ajaintervallide korrektseks kÀsitlemiseks. Temporal eesmÀrk on tuua need vÔimalused JavaScripti sisse.
Tutvustame JavaScript Temporali: Kaasaegne lÀhenemine ajale
Temporal API on pĂ”hjalik, uus globaalne objekt JavaScriptis, mis on loodud olema kaasaegne asendus vanale Date-objektile. Selle pĂ”hiprintsiibid on muutumatus, selgesĂ”naline ajavööndite kĂ€sitlemine ja selge ĂŒlesannete eraldamine erinevate ajakontseptsioonide vahel. Temporal tutvustab mitmeid uusi klasse, millest igaĂŒks esindab aja erinevat aspekti:
Temporal.Instant: Spetsiifiline, ĂŒhemĂ”tteline ajahetk, mis ei sĂ”ltu ĂŒhestki kalendrist ega ajavööndist (sarnane Unixi ajatempliga, kuid nanosekundi tĂ€psusega).Temporal.ZonedDateTime: Konkreetne ajahetk kindlas kalendris ja ajavööndis. See on kasutaja jaoks kĂ”ige tĂ€ielikum konkreetse kuupĂ€eva ja kellaaja esitus.Temporal.PlainDate: KalendrikuupĂ€ev (aasta, kuu, pĂ€ev) ilma kellaaja vĂ”i ajavööndita.Temporal.PlainTime: Kellaaeg (tund, minut, sekund jne) ilma kuupĂ€eva vĂ”i ajavööndita.Temporal.PlainDateTime: KalendrikuupĂ€ev ja kellaaeg koos, ilma ajavööndita.Temporal.PlainYearMonth: Konkreetne aasta ja kuu kalendrisĂŒsteemis.Temporal.PlainMonthDay: Konkreetne kuu ja pĂ€ev kalendrisĂŒsteemis.Temporal.Duration: MĂ€rgiga ajapikkus, nĂ€iteks "5 tundi ja 30 minutit" vĂ”i "2 pĂ€eva". See on meie juhendi fookuses.
KÔik Temporali objektid on muutumatud, mis tÀhendab, et operatsioonid nagu aja lisamine vÔi lahutamine loovad uusi objekte, mitte ei muuda olemasolevaid, parandades ettearvatavust ja vÀhendades vigu.
Temporal.Duration'i mÔistmine
Temporal.Duration esindab ajapikkust. Oluline on see, et see on sÔltumatu konkreetsest algus- vÔi lÔpp-punktist. See on lihtsalt "kui palju aega" möödus vÔi möödub. See vÔib koosneda aastatest, kuudest, nÀdalatest, pÀevadest, tundidest, minutitest, sekunditest, millisekunditest, mikrosekunditest ja nanosekunditest. Iga komponent on tÀisarv ja vÔib olla positiivne vÔi negatiivne.
NÀiteks "2 tundi ja 30 minutit" on kestus. "Periood 1. jaanuarist 1. mÀrtsini" on kestus kahe konkreetse punkti vahel, mida saab *esitada* Temporal.Duration'iga, kuid Duration ise on lihtsalt intervall.
Kestuse loomine
Temporal.Duration-objektide loomiseks on mitu lihtsat viisi:
1. Konstruktori kasutamine
Konstruktor vĂ”imaldab teil iga komponendi otse mÀÀrata. Pange tĂ€hele, et argumendid on jĂ€rjestatud suurimast ĂŒhikust (aastad) vĂ€ikseimani (nanosekundid).
// new Temporal.Duration(aastad, kuud, nÀdalad, pÀevad, tunnid, minutid, sekundid, millisekundid, mikrosekundid, nanosekundid)
// Kestus 2 tundi ja 30 minutit
const duration1 = new Temporal.Duration(0, 0, 0, 0, 2, 30, 0, 0, 0, 0);
console.log(duration1.toString()); // P2H30M
// Kestus 1 aasta, 2 kuud, 3 pÀeva
const duration2 = new Temporal.Duration(1, 2, 0, 3);
console.log(duration2.toString()); // P1Y2M3D
// Kestus -5 pÀeva
const duration3 = new Temporal.Duration(0, 0, 0, -5);
console.log(duration3.toString()); // P-5D
2. Temporal.Duration.from() kasutamine objektiga
See on sageli kÔige loetavam viis kestuste loomiseks, vÔimaldades teil mÀÀrata ainult need komponendid, mida vajate.
// Kestus 1,5 tundi
const halfHourDuration = Temporal.Duration.from({ hours: 1, minutes: 30 });
console.log(halfHourDuration.toString()); // P1H30M
// Kestus 7 pÀeva (1 nÀdal)
const oneWeekDuration = Temporal.Duration.from({ days: 7 });
console.log(oneWeekDuration.toString()); // P7D
// Kestus murdosa sekunditega (nt 2,5 sekundit)
const twoPointFiveSeconds = Temporal.Duration.from({ seconds: 2, milliseconds: 500 });
console.log(twoPointFiveSeconds.toString()); // PT2.5S
// Negatiivne kestus
const negativeDuration = Temporal.Duration.from({ minutes: -45 });
console.log(negativeDuration.toString()); // PT-45M
3. Temporal.Duration.from() kasutamine ISO 8601 stringiga
Temporal kasutab ISO 8601 kestuse vormingut, mis on standard kestuste esitamiseks. See on suurepÀrane kestuste parsimiseks vÀlistest andmeallikatest.
Vorming nÀeb tavaliselt vÀlja selline: P[aastad]Y[kuud]M[nÀdalad]W[pÀevad]DT[tunnid]H[minutid]M[sekundid]S. T eraldab kuupÀeva komponendid aja komponentidest.
// 1 aasta, 2 kuud, 3 pÀeva
const isoDuration1 = Temporal.Duration.from('P1Y2M3D');
console.log(isoDuration1.toString()); // P1Y2M3D
// 4 tundi, 5 minutit, 6 sekundit
const isoDuration2 = Temporal.Duration.from('PT4H5M6S');
console.log(isoDuration2.toString()); // PT4H5M6S
// Kombineeritud kestus
const isoDuration3 = Temporal.Duration.from('P7DT12H30M');
console.log(isoDuration3.toString()); // P7DT12H30M
// Toetatud on ka murdosa sekundid
const isoDuration4 = Temporal.Duration.from('PT1.5S');
console.log(isoDuration4.toString()); // PT1.5S
Aritmeetika tegemine kestustega
Temporal.Duration'i tĂ”eline jĂ”ud avaldub selle aritmeetilistes vĂ”imetes. Saate kestusi liita, lahutada, korrutada ja jagada ning neid ka teistele Temporali kuupĂ€eva-kellaaja tĂŒĂŒpidele liita/lahutada. KĂ”ik operatsioonid tagastavad muutumatuse tĂ”ttu uued Temporal.Duration-objektid.
Kestuste liitmine
Meetod add() ĂŒhendab kaks kestust.
const sprintDuration = Temporal.Duration.from({ weeks: 2 });
const bufferDuration = Temporal.Duration.from({ days: 3 });
const totalProjectTime = sprintDuration.add(bufferDuration);
console.log(totalProjectTime.toString()); // P2W3D (vÔi P17D, kui hiljem normaliseerida)
// Negatiivse kestuse lisamine on samavÀÀrne lahutamisega
const result = Temporal.Duration.from({ hours: 5 }).add({ hours: -2 });
console.log(result.toString()); // PT3H
Samuti saate lisada kestuse mis tahes Temporali kuupĂ€eva/kellaaja objektile. Siin toimub maagia, kuna Temporal kĂ€sitleb ajavööndi nihkeid ja suveaja ĂŒleminekuid asjakohaselt.
const projectStart = Temporal.PlainDateTime.from('2023-10-26T09:00:00');
const projectDuration = Temporal.Duration.from({ days: 10, hours: 4 });
const projectEnd = projectStart.add(projectDuration);
console.log(projectEnd.toString()); // 2023-11-05T13:00:00
// ZonedDateTime'iga rakendatakse ajavööndi reegleid Ôigesti
const meetingStartUTC = Temporal.ZonedDateTime.from('2024-03-09T14:00:00[UTC]');
const meetingDuration = Temporal.Duration.from({ hours: 1, minutes: 45 });
const meetingEndUTC = meetingStartUTC.add(meetingDuration);
console.log(meetingEndUTC.toString()); // 2024-03-09T15:45:00+00:00[UTC]
// NĂ€ide suveaja piiri ĂŒletamisest (eeldades, et 'Europe/Berlin' nihkub kell 03:00 31.03.2024)
const springForwardStart = Temporal.ZonedDateTime.from('2024-03-30T22:00:00[Europe/Berlin]');
const twentyFourHours = Temporal.Duration.from({ hours: 24 });
const nextDay = springForwardStart.add(twentyFourHours); // Lisab 24 tegelikku tundi
console.log(springForwardStart.toString()); // 2024-03-30T22:00:00+01:00[Europe/Berlin]
console.log(nextDay.toString()); // 2024-03-31T23:00:00+02:00[Europe/Berlin] (Kohalik aeg jĂ€ttis ĂŒhe tunni vahele)
Pange tĂ€hele, kuidas 24 tunni lisamine ajale 2024-03-30T22:00:00 Berliinis (mis on UTC+1) annab tulemuseks 2024-03-31T23:00:00 (nĂŒĂŒd UTC+2). Kell liikus ĂŒhe tunni vĂ”rra edasi, seega on kellaaeg seinal ĂŒks tund hilisem vĂ”rreldes algse kellaajaga. See demonstreerib tĂ€pselt Temporali ajavööndi ja suveaja teadlikkust aritmeetika tegemisel `ZonedDateTime`'iga.
Kestuste lahutamine
Meetod subtract() töötab sarnaselt add()-ga, kuid see eemaldab aega.
const deadlineDuration = Temporal.Duration.from({ days: 30 });
const gracePeriod = Temporal.Duration.from({ days: 5 });
const effectiveDeadline = deadlineDuration.subtract(gracePeriod);
console.log(effectiveDeadline.toString()); // P25D
const taskEnd = Temporal.PlainDateTime.from('2023-12-01T17:00:00');
const taskDuration = Temporal.Duration.from({ hours: 8, minutes: 30 });
const taskStart = taskEnd.subtract(taskDuration);
console.log(taskStart.toString()); // 2023-12-01T08:30:00
Kestuste korrutamine ja jagamine
Meetodid multiply() ja divide() skaleerivad kestuse komponente antud teguriga. See on kasulik stsenaariumide puhul, nagu nĂ€iteks ĂŒlesande mitme iteratsiooni koguaja arvutamine.
const trainingSession = Temporal.Duration.from({ minutes: 45 });
const weeklyTraining = trainingSession.multiply(5); // Viis seanssi nÀdalas
console.log(weeklyTraining.toString()); // PT225M
const totalProjectHours = Temporal.Duration.from({ hours: 160 });
const teamMembers = 4;
const hoursPerMember = totalProjectHours.divide(teamMembers);
console.log(hoursPerMember.toString()); // PT40H
Kestuste eitamine
Meetod negate() pöörab kestuse kÔigi komponentide mÀrgi vastupidiseks. Positiivne kestus muutub negatiivseks ja vastupidi.
const delayDuration = Temporal.Duration.from({ hours: 3 });
const advanceDuration = delayDuration.negate();
console.log(delayDuration.toString()); // PT3H
console.log(advanceDuration.toString()); // PT-3H
Kestuste absoluutvÀÀrtus
Meetod abs() tagastab uue Temporal.Duration'i, mille kÔik komponendid on positiivsed, andes teile efektiivselt kestuse suuruse, sÔltumata selle mÀrgist.
const negativeDelay = Temporal.Duration.from({ minutes: -60 });
const positiveDuration = negativeDelay.abs();
console.log(negativeDelay.toString()); // PT-60M
console.log(positiveDuration.toString()); // PT60M
Kestuste vÔrdlemine ja normaliseerimine
Kestuste vĂ”rdlemine vĂ”ib olla keeruline, eriti kui tegemist on erinevate ĂŒhikutega (nt kas 1 kuu on vĂ”rdne 30 pĂ€evaga?). Temporal pakub tööriistu nii vĂ”rdlemiseks kui ka normaliseerimiseks, et nende keerukustega toime tulla.
Kestuste vÔrdlemine compare()-ga
Staatiline meetod Temporal.Duration.compare(duration1, duration2, options) tagastab:
-1, kuiduration1on vÀiksem kuiduration20, kuiduration1on vÔrdneduration2-ga1, kuiduration1on suurem kuiduration2
Oluline on see, et kui vĂ”rrelda kestusi, mis sisaldavad muutuva pikkusega ĂŒhikuid nagu aastad, kuud vĂ”i nĂ€dalad, peate sageli pakkuma relativeTo valiku. See parameeter on `Temporal.ZonedDateTime` vĂ”i `Temporal.PlainDateTime` objekt, mis annab konteksti nende ĂŒhikute tĂ”lgendamiseks (nt mitu pĂ€eva on konkreetses kuus vĂ”i aastas).
const oneHour = Temporal.Duration.from({ hours: 1 });
const sixtyMinutes = Temporal.Duration.from({ minutes: 60 });
console.log(Temporal.Duration.compare(oneHour, sixtyMinutes)); // 0 (Need on samavÀÀrsed)
const oneMonth = Temporal.Duration.from({ months: 1 });
const thirtyDays = Temporal.Duration.from({ days: 30 });
// Ilma relativeTo-ta on kuu/aasta vÔrdlused keerulised
console.log(Temporal.Duration.compare(oneMonth, thirtyDays)); // 0 (Temporal teeb ilma kontekstita mÔistliku oletuse, sageli keskmise pÔhjal)
// Koos relativeTo-ga on vÔrdlus tÀpne, pÔhinedes konteksti kalendrile
const startOfJanuary = Temporal.PlainDate.from('2023-01-01');
const endOfFebruaryLeap = Temporal.PlainDate.from('2024-02-01'); // Liigaasta
// Jaanuaris 2023 on 1 kuu 31 pÀeva
const comparisonJan = Temporal.Duration.compare(oneMonth, thirtyDays, { relativeTo: startOfJanuary });
console.log(`1 kuu vs 30 pÀeva jaanuaris 2023: ${comparisonJan}`); // 1 (1 kuu > 30 pÀeva)
// Veebruaris 2024 (liigaasta) on 1 kuu 29 pÀeva
const comparisonFeb = Temporal.Duration.compare(oneMonth, thirtyDays, { relativeTo: endOfFebruaryLeap });
console.log(`1 kuu vs 30 pÀeva veebruaris 2024: ${comparisonFeb}`); // -1 (1 kuu < 30 pÀeva)
Kestuste normaliseerimine normalize() ja round()-ga
Kestusi saab esitada mitmel viisil (nt 90 minutit vĂ”i 1 tund ja 30 minutit). Normaliseerimine ja ĂŒmardamine aitavad neid esitusi jĂ€rjepidevuse ja kuvamise jaoks standardiseerida.
normalize()
Meetod normalize() lihtsustab kestuse komponente, kus see on vÔimalik (nt 60 minutit muutub 1 tunniks, 24 tundi muutub 1 pÀevaks, eeldusel et `relativeTo` kontekst lubab, kui kuud/aastad on kaasatud).
const longMinutes = Temporal.Duration.from({ minutes: 90 });
console.log(longMinutes.toString()); // PT90M
console.log(longMinutes.normalize().toString()); // PT1H30M
const multipleDays = Temporal.Duration.from({ hours: 48 });
console.log(multipleDays.toString()); // PT48H
console.log(multipleDays.normalize().toString()); // P2D
round()
Meetod round() on vĂ”imsam kestuste teisendamiseks ja ĂŒmardamiseks kindlatele ĂŒhikutele. See vĂ”tab valikute objekti, mis sisaldab:
largestUnit: Suurim ĂŒhik, mis vĂ€ljundisse lisatakse (nt 'years', 'days', 'hours').smallestUnit: VĂ€ikseim ĂŒhik, mis vĂ€ljundisse lisatakse (nt 'minutes', 'seconds', 'milliseconds').roundingIncrement: TĂ€isarv, millega vĂ€ikseimat ĂŒhikut ĂŒmardada (nt 5 lĂ€hima 5 minuti ĂŒmardamiseks).roundingMode: Kuidas kĂ€sitleda viike (nt 'halfExpand', 'trunc', 'ceil', 'floor').relativeTo: NĂ”utav aastate, kuude vĂ”i nĂ€dalatega kestuste ĂŒmardamiseks.
const complexDuration = Temporal.Duration.from({ hours: 2, minutes: 45, seconds: 30 });
// Ămarda lĂ€hima tunnini
const roundedToHours = complexDuration.round({ smallestUnit: 'hour' });
console.log(roundedToHours.toString()); // PT3H
// Ămarda lĂ€hima 30 minutini, sĂ€ilitades tunnid
const roundedTo30Minutes = complexDuration.round({
largestUnit: 'hour',
smallestUnit: 'minute',
roundingIncrement: 30
});
console.log(roundedTo30Minutes.toString()); // PT3H
const preciseDuration = Temporal.Duration.from({ minutes: 123, seconds: 45 });
// Kuva tundide ja minutitena
const formattedDuration = preciseDuration.round({ largestUnit: 'hour', smallestUnit: 'minute' });
console.log(formattedDuration.toString()); // PT2H4M
// Kuude/aastatega ĂŒmardamine nĂ”uab relativeTo
const longTermDuration = Temporal.Duration.from({ months: 1, days: 10 });
const referenceDate = Temporal.PlainDate.from('2023-01-15');
// Ămarda kuudeni, suhtes kuupĂ€evaga
const roundedToMonths = longTermDuration.round({ largestUnit: 'month', smallestUnit: 'month', relativeTo: referenceDate });
console.log(roundedToMonths.toString()); // P1M
Kestuste arvutamine Temporali objektide vahel
Ăks sagedasemaid kestuste kasutusviise on ajaintervalli arvutamine kahe konkreetse ajahetke vahel. Temporal pakub selleks oma kuupĂ€eva-kellaaja objektidel meetodeid until() ja since().
Meetod until()
Meetod until() arvutab kestuse vastuvĂ”tja objektist argumendi objektini. See on alguspunkti kaasa arvatav ja lĂ”pp-punkti vĂ€listav. See vĂ”tab sarnaselt round()-ga valikute objekti soovitud ĂŒhikute ja ĂŒmardamiskĂ€itumise mÀÀramiseks.
const startDate = Temporal.PlainDate.from('2023-01-01');
const endDate = Temporal.PlainDate.from('2023-03-15');
// Kestus suurimates vĂ”imalikes ĂŒhikutes (kuud, seejĂ€rel pĂ€evad)
const projectLength = startDate.until(endDate);
console.log(projectLength.toString()); // P2M14D
// Kestus puhtalt pÀevades
const totalDays = startDate.until(endDate, { largestUnit: 'day' });
console.log(totalDays.toString()); // P73D
// Kestus kahe konkreetse aja vahel, arvestades ajavööndeid
const meetingStart = Temporal.ZonedDateTime.from('2024-07-20T10:00:00[America/New_York]');
const meetingEnd = Temporal.ZonedDateTime.from('2024-07-20T11:30:00[America/New_York]');
const elapsedMeetingTime = meetingStart.until(meetingEnd, { largestUnit: 'hour', smallestUnit: 'minute' });
console.log(elapsedMeetingTime.toString()); // PT1H30M
// AjavöönditeĂŒlene kestus (NYC-st Londonisse)
const nyStartTime = Temporal.ZonedDateTime.from('2024-08-01T09:00:00[America/New_York]');
const londonEndTime = Temporal.ZonedDateTime.from('2024-08-01T17:00:00[Europe/London]');
const travelDuration = nyStartTime.until(londonEndTime);
console.log(travelDuration.toString()); // PT13H (Tegelik möödunud aeg, mitte kellaaja erinevus)
Viimane nÀide on eriti tÀhelepanuvÀÀrne. Kuigi New York on Londonist 5 tundi taga ja kellaajad seinal on 9 AM ja 5 PM samal pÀeval, arvutab meetod until() Ôigesti tegeliku möödunud aja, mis on 13 tundi. See on sellepÀrast, et ZonedDateTime kÀsitleb ajavööndi erinevust implitsiitselt.
Meetod since()
Meetod since() on until()-i vastand. See arvutab kestuse argumendi objektist vastuvÔtja objektini, mille tulemuseks on negatiivne kestus, kui argument on tulevikus vÔrreldes vastuvÔtjaga.
const currentDateTime = Temporal.ZonedDateTime.from('2024-06-15T12:00:00[Europe/Paris]');
const historicEvent = Temporal.ZonedDateTime.from('2024-01-01T00:00:00[Europe/Paris]');
const timeSinceEvent = currentDateTime.since(historicEvent, { largestUnit: 'month', smallestUnit: 'day' });
console.log(timeSinceEvent.toString()); // P5M14D
const futureDate = Temporal.PlainDate.from('2025-01-01');
const pastDate = Temporal.PlainDate.from('2024-01-01');
const durationFromFuture = pastDate.since(futureDate);
console.log(durationFromFuture.toString()); // P-1Y
Erinevate ĂŒhikute ja ĂŒmardamise kĂ€sitlemine arvutatud kestuste puhul
Kestuste arvutamisel on sageli vaja mÀÀrata `largestUnit` ja `smallestUnit`, et saada inimloetav esitus, eriti vanuse, möödunud aja vÔi loendurite puhul.
const birthDate = Temporal.PlainDate.from('1990-07-15');
const today = Temporal.PlainDate.from('2024-06-15');
// Arvuta vanus aastates, kuudes ja pÀevades
const age = birthDate.until(today, { largestUnit: 'year', smallestUnit: 'day' });
console.log(`Vanus: ${age.years} aastat, ${age.months} kuud, ${age.days} pÀeva`); // Vanus: 33 aastat, 11 kuud, 0 pÀeva
// Arvuta ĂŒlesande jĂ€relejÀÀnud aeg tundides ja minutites
const now = Temporal.Instant.fromEpochSeconds(Date.now() / 1000);
const deadline = Temporal.Instant.from('2024-07-01T09:00:00Z');
const timeLeft = now.until(deadline, { largestUnit: 'hour', smallestUnit: 'minute', roundingMode: 'ceil' });
console.log(`Aega jÀÀnud: ${timeLeft.hours} tundi ja ${timeLeft.minutes} minutit.`); // NÀide: Aega jÀÀnud: 355 tundi ja 38 minutit.
Kestuste vormindamine globaalsele publikule
Kuigi Temporal.Duration pakub tÀpseid, programmilisi esitusi ajaintervallidest, ei ole sellel sisseehitatud toLocaleString() meetodit. See on taotluslik: kestused on abstraktsed ajapikkused ja nende kuvamine vÔib oluliselt varieeruda sÔltuvalt kontekstist, lokaadist ja soovitud detailsuse tasemest. Teie kui arendaja vastutate kestuste esitamise eest kasutajasÔbralikul ja globaalselt arusaadaval viisil.
ISO 8601 stringi esitus
Temporal.Duration-objekti vaikemeetod toString() tagastab selle ISO 8601 stringi esituse. See on suurepÀrane masinatevaheliseks suhtluseks, serialiseerimiseks ja salvestamiseks, kuid harva otse lÔppkasutajatele kuvamiseks.
const examDuration = Temporal.Duration.from({ hours: 2, minutes: 15 });
console.log(examDuration.toString()); // PT2H15M
const holidayDuration = Temporal.Duration.from({ weeks: 2, days: 3 });
console.log(holidayDuration.toString()); // P2W3D
KĂ€sitsi vormindamine loetavuse ja rahvusvahelistamise jaoks
Kasutajale suunatud kuvamiseks eraldate tavaliselt kestuse komponendid ja vormindate need stringi interpoleerimise ja JavaScripti Intl API abil.
Siin on kohandatud funktsiooni nÀide, mis vormindab kestuse:
function formatDurationToHumanReadable(duration, locale = 'et-EE') {
const parts = [];
// Kasutades Intl.NumberFormat'i lokaaditeadlikuks numbrite vormindamiseks
const numberFormatter = new Intl.NumberFormat(locale);
if (duration.years !== 0) {
parts.push(numberFormatter.format(duration.years) + ' ' + (duration.years === 1 ? 'aasta' : 'aastat'));
}
if (duration.months !== 0) {
parts.push(numberFormatter.format(duration.months) + ' ' + (duration.months === 1 ? 'kuu' : 'kuud'));
}
if (duration.weeks !== 0) {
parts.push(numberFormatter.format(duration.weeks) + ' ' + (duration.weeks === 1 ? 'nÀdal' : 'nÀdalat'));
}
if (duration.days !== 0) {
parts.push(numberFormatter.format(duration.days) + ' ' + (duration.days === 1 ? 'pÀev' : 'pÀeva'));
}
if (duration.hours !== 0) {
parts.push(numberFormatter.format(duration.hours) + ' ' + (duration.hours === 1 ? 'tund' : 'tundi'));
}
if (duration.minutes !== 0) {
parts.push(numberFormatter.format(duration.minutes) + ' ' + (duration.minutes === 1 ? 'minut' : 'minutit'));
}
if (duration.seconds !== 0) {
// Ămarda sekundid kuvamiseks, kui neil on murdosa
const roundedSeconds = numberFormatter.format(duration.seconds.toFixed(0)); // VĂ”i toFixed(1) ĂŒhe komakoha jaoks
parts.push(roundedSeconds + ' ' + (duration.seconds === 1 ? 'sekund' : 'sekundit'));
}
if (parts.length === 0) {
// KÀsitse juhtumeid, kus kestus on null vÔi vÀga vÀike (nt ainult nanosekundid)
if (duration.milliseconds !== 0 || duration.microseconds !== 0 || duration.nanoseconds !== 0) {
const totalMs = duration.milliseconds + duration.microseconds / 1000 + duration.nanoseconds / 1_000_000;
return numberFormatter.format(totalMs.toFixed(2)) + ' millisekundit';
}
return '0 sekundit';
}
// Ăhenda osad komadega ja 'ja'-ga viimase osa jaoks (eestikeelne ĂŒhendamine)
if (parts.length > 1) {
const lastPart = parts.pop();
return parts.join(', ') + ' ja ' + lastPart;
} else {
return parts[0];
}
}
const tripDuration = Temporal.Duration.from({ days: 3, hours: 10, minutes: 45 });
console.log(formatDurationToHumanReadable(tripDuration, 'et-EE')); // 3 pÀeva, 10 tundi ja 45 minutit
const meetingReminder = Temporal.Duration.from({ minutes: 5 });
console.log(formatDurationToHumanReadable(meetingReminder, 'et-EE')); // 5 minutit
const microDuration = Temporal.Duration.from({ nanoseconds: 1234567 });
console.log(formatDurationToHumanReadable(microDuration, 'et-EE')); // 1,23 millisekundit
Keerulisema mitmuse ja lokaliseeritud loendivorminduse jaoks vÔiksite seda kombineerida Intl.RelativeTimeFormat'iga vÔi keerukamate stringimallide teekidega. VÔti on eraldada kestuse arvutamine (mida teeb Temporal) selle esitusest (mida teeb teie vormindusloogika ja Intl).
Intl.DurationFormat'i kasutamine (Tulevik/Ettepanek)
KĂ€imas on TC39 ettepanek Intl.DurationFormat'i kohta, mille eesmĂ€rk on pakkuda natiivset, lokaaditeadlikku viisi kestuste vormindamiseks. Kui see standardiseeritakse ja rakendatakse, lihtsustaks see oluliselt ĂŒlaltoodud kĂ€sitsi vormindamist, pakkudes robustset lahendust rahvusvahelistamiseks otse JavaScripti ökosĂŒsteemis.
See töötaks tÔenÀoliselt sarnaselt teiste Intl-objektidega:
// See on hĂŒpoteetiline ja pĂ”hineb ettepaneku praegusel seisul
// Kontrollige brauseri ĂŒhilduvust enne tootmises kasutamist
/*
const duration = Temporal.Duration.from({ days: 1, hours: 2, minutes: 30 });
const formatter = new Intl.DurationFormat('et-EE', {
style: 'long',
years: 'long',
days: 'long',
hours: 'long',
minutes: 'long',
});
console.log(formatter.format(duration)); // "1 pÀev, 2 tundi, 30 minutit"
const shortFormatter = new Intl.DurationFormat('et-EE', { style: 'short', hours: 'numeric', minutes: 'numeric' });
console.log(shortFormatter.format(duration)); // "1 p, 2 t, 30 min"
*/
Kuigi see pole veel kÔigis keskkondades saadaval, hoidke sellel ettepanekul silm peal, sest see tÔotab olla tulevikus lÔplik lahendus globaalseks kestuste vormindamiseks.
Praktilised kasutusjuhud ja globaalsed kaalutlused
Temporal.Duration ei ole lihtsalt akadeemiline parendus; see lahendab reaalseid probleeme rakendustes, mis tegutsevad erinevates ajavööndites ja kultuurides.
1. Planeerimine ja sĂŒndmuste haldamine
Rahvusvahelisi sĂŒndmusi, konverentse vĂ”i kohtumisi haldavate platvormide jaoks on sĂŒndmuste kestuste, sĂŒndmuseni jÀÀnud aja vĂ”i pausi pikkuse arvutamine kriitilise tĂ€htsusega. Temporal.Duration tagab, et need arvutused on tĂ€psed, olenemata kasutaja asukohast vĂ”i kohalikest ajavööndi reeglitest.
// Arvuta globaalse veebiseminari jÀrelejÀÀnud aeg
const now = Temporal.ZonedDateTime.from('2024-07-25T10:00:00[Europe/London]'); // NĂ€itlik praegune aeg
const webinarStart = Temporal.ZonedDateTime.from('2024-07-26T14:30:00[Asia/Tokyo]');
const timeUntilWebinar = now.until(webinarStart, {
largestUnit: 'hour',
smallestUnit: 'minute',
roundingMode: 'ceil' // Ămarda ĂŒlespoole, et kasutajad sellest ilma ei jÀÀks
});
console.log(`Veebiseminar algab ${timeUntilWebinar.hours} tunni ja ${timeUntilWebinar.minutes} minuti pÀrast.`);
// VÀljund on tÀpne, pÔhinedes tegelikul möödunud ajal nende kahe ZonedDateTime'i vahel.
2. JÔudlusmÔÔdikud ja logimine
Operatsioonide tÀitmise aja, API vastuseaegade vÔi pakett-tööde kestuste mÔÔtmine nÔuab suurt tÀpsust. Temporal.Duration, eriti kombineerituna Temporal.Instant'iga (mis pakub nanosekundi tÀpsust), on selleks ideaalne.
const startTime = Temporal.Instant.now();
// Simuleeri keerulist operatsiooni
for (let i = 0; i < 1_000_000; i++) { Math.sqrt(i); }
const endTime = Temporal.Instant.now();
const executionDuration = startTime.until(endTime);
// Vorminda sekunditeks koos millisekunditega kuvamiseks
const formattedExecution = executionDuration.round({ smallestUnit: 'millisecond', largestUnit: 'second' });
console.log(`Operatsioon vÔttis aega ${formattedExecution.seconds}.${String(formattedExecution.milliseconds).padStart(3, '0')} sekundit.`);
3. Finantsarvutused
Finantsvaldkonnas on tĂ€psed ajaintervallid intresside, laenutingimuste vĂ”i investeerimisperioodide arvutamisel ĂŒlimalt tĂ€htsad. PĂ€evade, kuude vĂ”i aastate tĂ€pne arv perioodis peab olema tĂ€pne, eriti kui tegemist on liigaastate vĂ”i konkreetsete kuupikkustega.
const loanStartDate = Temporal.PlainDate.from('2023-04-01');
const loanEndDate = Temporal.PlainDate.from('2028-03-31');
const loanTerm = loanStartDate.until(loanEndDate, { largestUnit: 'year', smallestUnit: 'month' });
console.log(`Laenuperiood: ${loanTerm.years} aastat ja ${loanTerm.months} kuud.`); // 4 aastat ja 11 kuud
4. Rahvusvahelistamise vÀljakutsed uuesti vaadelduna
-
Ajavööndid ja suveaeg:
Temporal.Durationise on ajavööndist sĂ”ltumatu; see esindab fikseeritud ajapikkust. Kuid kui lisate vĂ”i lahutateDuration'iZonedDateTime'ist, rakendab Temporal korrektselt ajavööndi reegleid, sealhulgas suveaja nihkeid. See tagab, et "24-tunnine kestus" liigutabZonedDateTime'i tĂ”epoolest 24 tegeliku tunni vĂ”rra edasi, isegi kui see tĂ€hendab suveaja piiri ĂŒletamist, mis muudab *kellaaja* seinal lĂŒhemaks vĂ”i pikemaks. See jĂ€rjepidevus on suur vĂ”it `Date`'i ĂŒle. -
Kultuurilised erinevused: Erinevad kultuurid vÀljendavad kestusi erinevalt. Kuigi
Temporal.Durationpakub tooreid komponente (aastad, kuud, pÀevad jne), on teie vastutus kasutada `Intl` API-sid vÔi kohandatud loogikat, et esitada neid viisil, mis on kasutaja lokaadile omane. NÀiteks vÔivad mÔned kultuurid vÀljendada "1 tund ja 30 minutit" kui "90 minutit" vÔi kasutada erinevaid mitmuse reegleid. -
KalendrisĂŒsteemid: Temporal toetab ka erinevaid kalendrisĂŒsteeme (nt Jaapani, PĂ€rsia, Islami kalendrid). Kuigi
Durationise on kalendrist sĂ”ltumatu, austab aritmeetika kalendriteadlike tĂŒĂŒpidega naguPlainDatevĂ”iZonedDateTimesuheldes konkreetse kalendri reegleid (nt pĂ€evade arv kuus, liigaasta reeglid selles kalendris). See on ĂŒlioluline globaalsete rakenduste jaoks, mis vĂ”ivad vajada kuupĂ€evade kuvamist mitte-Gregoriuse kalendrites.
Temporali praegune staatus ja kasutuselevÔtt
2023. aasta lÔpu / 2024. aasta alguse seisuga on JavaScript Temporal API 3. etapi TC39 ettepanek. See tÀhendab, et spetsifikatsioon on suures osas stabiilne ning seda rakendatakse ja testitakse erinevates JavaScripti mootorites ja brauserites. Suured brauserid nagu Chrome, Firefox ja Safari töötavad aktiivselt Temporali rakendamise kallal, kusjuures eksperimentaalsed lipud vÔi varajased versioonid on juba saadaval.
Kuigi see pole veel universaalselt saadaval ilma polĂŒfillita, nĂ€itab selle edasijĂ”udnud etapp, et see saab suure tĂ”enĂ€osusega JavaScripti standardseks osaks. Arendajad saavad tĂ€na hakata Temporaliga katsetama, kasutades polĂŒfille vĂ”i lubades oma brauseri arenduskeskkondades eksperimentaalseid funktsioone. Varajane kasutuselevĂ”tt vĂ”imaldab teil eesrindlik olla, mĂ”ista selle eeliseid ja integreerida see oma projektidesse, kui brauseri tugi laieneb.
Selle lÔpuks laialdane kasutuselevÔtt vÀhendab oluliselt vajadust vÀliste kuupÀeva/aja teekide jÀrele, pakkudes robustset, natiivset lahendust JavaScripti ajahalduseks.
Parimad praktikad Temporal Durationi kasutamisel
Temporal.Duration'i eeliste maksimeerimiseks oma rakendustes kaaluge neid parimaid praktikaid:
-
Eelistage
Temporal.Duration.from(): Teadaolevatest komponentidest vÔi ISO-stringidest kestuste loomisel onTemporal.Duration.from()objektiliteraaliga sageli loetavam ja vÀhem vigadele altis kui konstruktori positsioonilised argumendid. -
Kasutage
relativeTomitmetĂ€henduslike vĂ”rdluste jaoks: Pakkuge alatirelativeTovalikut, kui vĂ”rdlete vĂ”i ĂŒmardate kestusi, mis sisaldavad aastaid, kuid vĂ”i nĂ€dalaid. See tagab tĂ€psed arvutused, pakkudes vajaliku kalendrikonteksti. -
Kasutage
until()jasince(): Kahe konkreetse ajahetke vahelise intervalli arvutamiseks eelistage Temporali kuupÀeva-kellaaja objektide meetodeiduntil()jasince(). Need kÀsitlevad korrektselt ajavööndite ja suveaja keerukusi. -
Normaliseerige ja ĂŒmardage kuvamiseks: Enne kestuste esitamist kasutajatele kaaluge
normalize()ja eritiround()kasutamist, et teisendada kestus kĂ”ige sobivamatesse ja arusaadavamatesse ĂŒhikutesse (nt 90 minuti teisendamine "1 tunniks ja 30 minutiks"). -
Eraldage sisemine esitus kuvamisest: Hoidke oma sisemised kestuse arvutused tÀpsed
Temporal.Duration'iga. Teisendage ja vormindage kuvamiseks ainult kasutajaliidese renderdamisel, kasutades kohandatud vormindusfunktsioone jaIntlAPI-d globaalse tĂ€psuse tagamiseks. - Olge kursis: Hoidke silm peal Temporali API edusammudel ja brauseri ĂŒhilduvusel. Kuna see liigub tĂ€ieliku standardiseerimise suunas, areneb ökosĂŒsteem ja vĂ”ivad tekkida uued tööriistad vĂ”i parimad praktikad.
- Olge tĂ€psusega teadlik: Kuigi Temporal toetab nanosekundi tĂ€psust, kasutage ainult seda tĂ€psust, mida tegelikult vajate. Suurem tĂ€psus vĂ”ib mĂ”nikord muuta silumise raskemaks vĂ”i pĂ”hjustada ootamatuid ĂŒmardamisi madalama tĂ€psusega kuvaritele teisendamisel.
KokkuvÔte
Temporal.Duration'i kasutuselevĂ”tt tĂ€histab olulist hĂŒpet edasi JavaScripti arendajatele, kes tegelevad ajaintervallide aritmeetikaga. Pakkudes muutumatut, selgesĂ”nalist ja globaalselt teadlikku API-d, lahendab Temporal vana Date-objekti pikaajalised piirangud.
NĂŒĂŒd saate enesekindlalt sooritada keerulisi ajaarvutusi, tĂ€pselt mÔÔta perioode ja esitada kestusi viisil, mis on nii tĂ€pne kui ka kultuuriliselt sobiv kasutajatele ĂŒle maailma. ĂkskĂ”ik, kas arvutate tarkvara vĂ€ljalasketsĂŒkli kestust, ĂŒlemaailmse toote turuletoomiseni jÀÀnud aega vĂ”i inimese tĂ€pset vanust, pakub Temporal.Duration teile tööriistu, mida vajate robustsete ja usaldusvÀÀrsete rakenduste loomiseks.
VĂ”tke omaks Temporal.Duration ja muutke seda, kuidas te oma JavaScripti projektides aega haldate. JavaScripti kuupĂ€evade ja kellaaegade kĂ€sitlemise tulevik on siin, lubades ettearvatavamat, vĂ”imsamat ja globaalselt ĂŒhilduvamat arenduskogemust.